﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using WCFRequerimientos.Dominio;
using WCFRequerimientos.Persistencia;
using System.Messaging;

namespace WCFRequerimientos
{
    public class ServiceRequerimiento : IServiceRequerimiento
    {
        private GRMaeRequerimientoDAO maeDrequerimientoDAO = null;
        private GRMaeRequerimientoDAO MaeRequerimientoDAO
        {
            get
            {
                if (maeDrequerimientoDAO == null)
                    maeDrequerimientoDAO = new GRMaeRequerimientoDAO();
                return maeDrequerimientoDAO;
            }
        }

        private GREstadoReqDAO estadoReqDAO = null;
        private GREstadoReqDAO EstadoReqDAO
        {
            get
            {
                if (estadoReqDAO == null)
                    estadoReqDAO = new GREstadoReqDAO();
                return estadoReqDAO;
            }
        }

        public Int32 RegistrarRequerimiento(GRMaeRequerimiento objRequerimiento,
                                             List<GRDetRequerimiento> ListaDetalle)
        {
            return MaeRequerimientoDAO.RegistrarRequerimiento(objRequerimiento, ListaDetalle);
        }

        public List<GRMaeRequerimiento> ConsultarRequerimientosPorAprobar(int iNumReq, int iCodUsuReg, DateTime dtFecIni, DateTime dtFecfin)
        {
            return MaeRequerimientoDAO.ConsultarRequerimientosPorAprobar(iNumReq, iCodUsuReg, dtFecIni, dtFecfin);
        }

        public Boolean AprobarRequerimiento(GRMaeRequerimiento objRequerimiento, GRMovRequerimiento objMovRequerimiento)
        {

            return MaeRequerimientoDAO.AprobarRequerimiento(objRequerimiento, objMovRequerimiento);
        }

        public List<GRMaeRequerimiento> ListarRequerimientos()
        {
            return MaeRequerimientoDAO.ListarRequerimientos();
        }

        public List<GRMovRequerimiento> ObtenerMovimientoRequerimiento(Int32 intCodigoRequerimiento)
        {
            return MaeRequerimientoDAO.ObtenerMovimientoRequerimiento(intCodigoRequerimiento);
        }

        public GRMaeRequerimiento ObtenerRequerimiento(Int32 intCodigoRequerimiento)
        {
            return MaeRequerimientoDAO.ObtenerRequerimiento(intCodigoRequerimiento);
        }

        public List<GRDetRequerimiento> ObtenerDetalleRequerimiento(Int32 intCodigoRequerimiento)
        {
            return MaeRequerimientoDAO.ObtenerDetalleRequerimiento(intCodigoRequerimiento);
        }

        public List<GREstadoReq> ListarEstados()
        {
            return EstadoReqDAO.ListarEstados();
        }

        public GREstadoReq ObtenerDatosEstado(Int32 intCodigoEstado)
        {
            return EstadoReqDAO.ObtenerDatosEstado(intCodigoEstado);
        }

        public bool AtenderRequerimiento(GRMovRequerimiento objMovRequerimiento)
        {
            String rutaCola = @".\private$\jSystemCloud";
            if (!MessageQueue.Exists(rutaCola))
                MessageQueue.Create(rutaCola);

            MessageQueue cola = new MessageQueue(rutaCola);
            int intEncolados = cola.GetAllMessages().Count();
            cola.Formatter = new XmlMessageFormatter(new Type[] { typeof(GRMovRequerimiento) });

            for (int i = 1; i <= intEncolados; i++)
            {
                Message mensaje = cola.Receive();
                GRMovRequerimiento objMovRequerimientoAux = (GRMovRequerimiento)mensaje.Body;

                if (mensaje.Body != null)
                {
                    MaeRequerimientoDAO.AtenderRequerimiento(objMovRequerimientoAux);
                }
            }
            return MaeRequerimientoDAO.AtenderRequerimiento(objMovRequerimiento);
        }

        public List<GRMaeRequerimiento> ConsultarRequerimientoXCriterio(Int32 criterio, String criteriotexto)
        {
            return MaeRequerimientoDAO.ConsultarRequerimientoXCriterio(criterio, criteriotexto);
        }

    }
}